// /*
//  * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd.
//  * Licensed under the Apache License, Version 2.0 (the "License");
//  * you may not use this file except in compliance with the License.
//  * You may obtain a copy of the License at
//  *
//  * http://www.apache.org/licenses/LICENSE-2.0
//  *
//  * Unless required by applicable law or agreed to in writing, software
//  * distributed under the License is distributed on an "AS IS" BASIS,
//  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  * See the License for the specific language governing permissions and
//  * limitations under the License.
//  */

// #include "cJSON.h"
// #include "sub_thing_model.h"
// #include "iot_connect_log.h"
// #include "sle_bridge_errors.h"
// #include "iotc_oh_sle.h"
// #include <functional>
// #include <iterator>

// namespace OHOS {
// namespace iotConnect {
// uint64_t SubThingModel::seq = 0;
// std::unordered_map<int, MessageTimerAttr*> SubThingModel:: um_timers_ = {};
// int32_t SubThingModel::DevInfoGetCharState(const char *devId, const IotcServiceInfo *svc, char *data, uint32_t len)
// {
//     int32_t res = SLE_BRIDGE_FAILED;
//     if (data == NULL) {
//         HILOGE("param invalid");
//         return SLE_BRIDGE_ERR_INVALID_PARAM;
//     }

//     // cJSON *json = cJSON_CreateObject();
//     // if (json == NULL) {
//     //     HILOGE("create obj error");
//     //     return SLE_BRIDGE_ERR_CREATE_JSON;
//     // }

//     // if (cJSON_AddStringToObject(json, "allService", sleBaseDeviceInfo_.brand.c_str()) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add string error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddNumberToObject(json, "peerConnectStatus", sleBaseDeviceInfo_.peerConnectStatus) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add num error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // *data = cJSON_PrintUnformatted(json);
//     // *len = strlen(*data);
//     res = IotcOhSleSendCustomSecData(devId, (uint8_t*)data, len);
//     if(res != SLE_BRIDGE_SUCCESS) {
//         HILOGE("IotcOhSleSendCustomSecData error, res: %{public}d", res);
//         return SLE_BRIDGE_FAILED;
//     }

//     SubThingModelWaitReply(devId, seq++, timeout, svc->svcId);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::SleInfoGetCharState(const char *devId, const IotcServiceInfo *svc, char *data, uint32_t len)
// {
//     // if (data == NULL || *data != NULL) {
//     //     HILOGE("param invalid");
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }

//     // cJSON *json = cJSON_CreateObject();
//     // if (json == NULL) {
//     //     HILOGE("create obj error");
//     //     return SLE_BRIDGE_ERR_CREATE_JSON;
//     // }

//     // if (cJSON_AddStringToObject(json, "sleMac", sleBaseSleInfo_.sleMac.c_str()) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add string error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddNumberToObject(json, "RSSI", sleBaseSleInfo_.RSSI) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add num error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // *data = cJSON_PrintUnformatted(json);
//     // cJSON_Delete(json);
//     // if (*data == NULL) {
//     //     HILOGE("json print error");
//     //     return SLE_BRIDGE_ERR_PRINT_JSON;
//     // }
//     // *len = strlen(*data);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::ConfigurationManagementGetCharState(const char *devId, const IotcServiceInfo *svc, char *data, uint32_t len)
// {
//     // if (data == NULL || *data != NULL) {
//     //     HILOGE("param invalid");
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }

//     // cJSON *json = cJSON_CreateObject();
//     // if (json == NULL) {
//     //     HILOGE("create obj error");
//     //     return SLE_BRIDGE_ERR_CREATE_JSON;
//     // }

//     // if (cJSON_AddNumberToObject(json, "accessType", configurationManagementInfo_.accessType) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add num error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddStringToObject(json, "deviceName", configurationManagementInfo_.deviceName.c_str()) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add string error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // *data = cJSON_PrintUnformatted(json);
//     // cJSON_Delete(json);
//     // if (*data == NULL) {
//     //     HILOGE("json print error");
//     //     return SLE_BRIDGE_ERR_PRINT_JSON;
//     // }
//     // *len = strlen(*data);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::ConfigurationManagementPutCharState(const char *devId, const IotcServiceInfo *svc, const char *data, uint32_t len)
// {
//     // if (data == NULL || len == 0) {
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }
//     // cJSON *json = cJSON_Parse(data);
//     // if (json == NULL) {
//     //     HILOGE("Parse json error");
//     //     return SLE_BRIDGE_ERR_PARSE_JSON;
//     // }

//     // cJSON *item = cJSON_GetObjectItem(json, "deviceName");
//     // if (item == NULL || !cJSON_IsString(item)) {
//     //     cJSON_Delete(json);
//     //     return SLE_BRIDGE_FAILED;
//     // }
//     // configurationManagementInfo_.deviceName = cJSON_GetStringValue(item);

//     // cJSON_Delete(json);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::CPUInfoGetCharState(const char *devId, const IotcServiceInfo *svc, char *data, uint32_t len)
// {
//     // if (data == NULL || *data != NULL) {
//     //     HILOGE("param invalid");
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }

//     // cJSON *json = cJSON_CreateObject();
//     // if (json == NULL) {
//     //     HILOGE("create obj error");
//     //     return SLE_BRIDGE_ERR_CREATE_JSON;
//     // }

//     // if (cJSON_AddStringToObject(json, "manufacturer", sleBaseCPUInfo_.manufacturer.c_str()) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add string error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddStringToObject(json, "model", sleBaseCPUInfo_.model.c_str()) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add string error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // *data = cJSON_PrintUnformatted(json);
//     // cJSON_Delete(json);
//     // if (*data == NULL) {
//     //     HILOGE("json print error");
//     //     return SLE_BRIDGE_ERR_PRINT_JSON;
//     // }
//     // *len = strlen(*data);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::OSInfoGetCharState(const char *devId, const IotcServiceInfo *svc, char *data, uint32_t len)
// {
//     // if (data == NULL || *data != NULL) {
//     //     HILOGE("param invalid");
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }

//     // cJSON *json = cJSON_CreateObject();
//     // if (json == NULL) {
//     //     HILOGE("create obj error");
//     //     return SLE_BRIDGE_ERR_CREATE_JSON;
//     // }

//     // if (cJSON_AddStringToObject(json, "version", sleBaseOSInfo_.version.c_str()) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add string error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddNumberToObject(json, "type", sleBaseOSInfo_.type) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add num error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // *data = cJSON_PrintUnformatted(json);
//     // cJSON_Delete(json);
//     // if (*data == NULL) {
//     //     HILOGE("json print error");
//     //     return SLE_BRIDGE_ERR_PRINT_JSON;
//     // }
//     // *len = strlen(*data);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::OTAInfoGetCharState(const char *devId, const IotcServiceInfo *svc, char *data, uint32_t len)
// {
//     // if (data == NULL || *data != NULL) {
//     //     HILOGE("param invalid");
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }

//     // cJSON *json = cJSON_CreateObject();
//     // if (json == NULL) {
//     //     HILOGE("create obj error");
//     //     return SLE_BRIDGE_ERR_CREATE_JSON;
//     // }

//     // if (cJSON_AddNumberToObject(json, "action", sleBaseOTAInfo_.action) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add num error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddNumberToObject(json, "bootTime", sleBaseOTAInfo_.bootTime) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add num error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddStringToObject(json, "introduction", sleBaseOTAInfo_.introduction.c_str()) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add string error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddNumberToObject(json, "progress", sleBaseOTAInfo_.progress) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add num error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddStringToObject(json, "version", sleBaseOTAInfo_.version.c_str()) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add string error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddStringToObject(json, "url", sleBaseOTAInfo_.url.c_str()) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add string error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddBoolToObject(json, "on", sleBaseOTAInfo_.on) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add bool error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // if (cJSON_AddNumberToObject(json, "code", sleBaseOTAInfo_.code) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add num error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // *data = cJSON_PrintUnformatted(json);
//     // cJSON_Delete(json);
//     // if (*data == NULL) {
//     //     HILOGE("json print error");
//     //     return SLE_BRIDGE_ERR_PRINT_JSON;
//     // }
//     // *len = strlen(*data);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::OTAInfoPutCharState(const char *devId, const IotcServiceInfo *svc, const char *data, uint32_t len)
// {
//     // if (data == NULL || len == 0) {
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }
//     // cJSON *json = cJSON_Parse(data);
//     // if (json == NULL) {
//     //     HILOGE("Parse json error");
//     //     return SLE_BRIDGE_ERR_PARSE_JSON;
//     // }

//     // cJSON *item = cJSON_GetObjectItem(json, "on");
//     // if (item == NULL || !cJSON_IsBool(item)) {
//     //     cJSON_Delete(json);
//     //     return SLE_BRIDGE_ERR_GET_JSON_DATA;
//     // }

//     // if (item->type == cJSON_True) {
//     //     // TODO: 需要添加具体业务
//     //     sleBaseOTAInfo_.on = true;
//     // } else {
//     //     // TODO: 需要添加具体业务
//     //     sleBaseOTAInfo_.on = false;
//     // }
//     // cJSON_Delete(json);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::RestartInfoGetCharState(const char *devId, const IotcServiceInfo *svc, char *data, uint32_t len)
// {
//     // if (data == NULL || *data != NULL) {
//     //     HILOGE("param invalid");
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }

//     // cJSON *json = cJSON_CreateObject();
//     // if (json == NULL) {
//     //     HILOGE("create obj error");
//     //     return SLE_BRIDGE_ERR_CREATE_JSON;
//     // }

//     // if (cJSON_AddBoolToObject(json, "restart", sleBaseRestartInfo_.restart) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add bool error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // *data = cJSON_PrintUnformatted(json);
//     // cJSON_Delete(json);
//     // if (*data == NULL) {
//     //     HILOGE("json print error");
//     //     return SLE_BRIDGE_ERR_PRINT_JSON;
//     // }
//     // *len = strlen(*data);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::RestartInfoPutCharState(const char *devId, const IotcServiceInfo *svc, const char *data, uint32_t len)
// {
//     // if (data == NULL || len == 0) {
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }
//     // cJSON *json = cJSON_Parse(data);
//     // if (json == NULL) {
//     //     HILOGE("Parse json error");
//     //     return SLE_BRIDGE_ERR_PARSE_JSON;
//     // }

//     // cJSON *item = cJSON_GetObjectItem(json, "restart");
//     // if (item == NULL || !cJSON_IsBool(item)) {
//     //     cJSON_Delete(json);
//     //     return SLE_BRIDGE_ERR_GET_JSON_DATA;
//     // }

//     // if (item->type == cJSON_True) {
//     //         // TODO: 需要添加具体业务
//     //     sleBaseRestartInfo_.restart = true;
//     // } else {
//     //         // TODO: 需要添加具体业务
//     //     sleBaseRestartInfo_.restart = false;
//     // }
//     // cJSON_Delete(json);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::FactoryResetGetCharState(const char *devId, const IotcServiceInfo *svc, char *data, uint32_t len)
// {
//     // if (data == NULL || *data != NULL) {
//     //     HILOGE("param invalid");
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }

//     // cJSON *json = cJSON_CreateObject();
//     // if (json == NULL) {
//     //     HILOGE("create obj error");
//     //     return SLE_BRIDGE_ERR_CREATE_JSON;
//     // }

//     // if (cJSON_AddBoolToObject(json, "factoryReset", sleBaseFactoryReset_.resetAllSettings) == NULL) {
//     //     cJSON_Delete(json);
//     //     HILOGE("add bool error");
//     //     return SLE_BRIDGE_ERR_ADD_JSON_DATA;
//     // }

//     // *data = cJSON_PrintUnformatted(json);
//     // cJSON_Delete(json);
//     // if (*data == NULL) {
//     //     HILOGE("json print error");
//     //     return SLE_BRIDGE_ERR_PRINT_JSON;
//     // }
//     // *len = strlen(*data);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::FactoryResetPutCharState(const char *devId, const IotcServiceInfo *svc, const char *data, uint32_t len)
// {
//     // if (data == NULL || len == 0) {
//     //     return SLE_BRIDGE_ERR_INVALID_PARAM;
//     // }
//     // cJSON *json = cJSON_Parse(data);
//     // if (json == NULL) {
//     //     HILOGE("Parse json error");
//     //     return SLE_BRIDGE_ERR_PARSE_JSON;
//     // }

//     // cJSON *item = cJSON_GetObjectItem(json, "resetAllSettings");
//     // if (item == NULL || !cJSON_IsBool(item)) {
//     //     cJSON_Delete(json);
//     //     return SLE_BRIDGE_ERR_GET_JSON_DATA;
//     // }

//     // if (item->type == cJSON_True) {
//     //     // TODO: 需要添加具体业务,与下挂设备进行通信
//     //     // 发送单个服务信息
//     //     // {
//     //     //  FactoryReset
//     //     //
//     //     //   }
//     //     sleBaseFactoryReset_.resetAllSettings = true;
//     // } else {
//     //     // TODO: 需要添加具体业务,与下挂设备进行通信
//     //     sleBaseFactoryReset_.resetAllSettings = false;
//     // }
//     // cJSON_Delete(json);
//     return SLE_BRIDGE_SUCCESS;
// }

// int32_t SubThingModel::ServiceListGetCharState(const char *devId, const IotcServiceInfo *svc, char *data, uint32_t len)
// {
//     return SLE_BRIDGE_FAILED;
// }

// int32_t SubThingModel::ServiceListPutCharState(const char *devId, const IotcServiceInfo *svc, const char *data, uint32_t len)
// {
//     return SLE_BRIDGE_FAILED;
// }



// void SubThingModel::SubThingModelWaitReply(const char *devId, const uint32_t seq, const uint16_t timeout, const char *svcId)
// {
//     uint32_t res = 0;
//     struct sigevent sev;
//     struct itimerspec its;
//     MessageTimerAttr* mess_attr = new MessageTimerAttr;
//     mess_attr->seq = seq;
//     mess_attr->devId = (char*)new char[strlen(devId) + 1];
//     memset(mess_attr->devId, 0, strlen(devId) + 1);
//     memcpy(mess_attr->devId, devId, strlen(devId));

//     mess_attr->svcId = (char*)new char[strlen(svcId) + 1];
//     memset(mess_attr->svcId, 0, strlen(svcId) + 1);
//     memcpy(mess_attr->svcId, svcId, strlen(svcId));

//     mess_attr->onResult = SubThingModelExecResultRpyly;

//     sev.sigev_notify = SIGEV_THREAD;
//     sev.sigev_notify_function = SubThingModelTimerHandler;
//     sev.sigev_notify_attributes = nullptr;
//     sev.sigev_value.sival_ptr = mess_attr;

//     timer_t timer_id;
//     res = timer_create(CLOCK_REALTIME, &sev, &timer_id);
//     if(-1 == res) {
//         HILOGE("timer_create error, res: %{public}d", res);
//         delete mess_attr->devId;
//         delete mess_attr;
//         return;
//     }

//     mess_attr->timerId = timer_id;

//     its.it_value.tv_sec = timeout;
//     its.it_value.tv_nsec = 0;
//     its.it_interval.tv_sec = 0;
//     its.it_interval.tv_nsec = 0;

//     res = timer_settime(timer_id, 0, &its, nullptr);
//     if(-1 == res) {
//         HILOGE("timer_settime error, res: %{public}d", res);
//         delete mess_attr->devId;
//         delete mess_attr;
//         return;
//     }

//     HILOGI("add timer, seq: %{public}u", seq);
//     um_timers_[seq] = mess_attr;
// }

// void SubThingModel::SubThingModelTimerHandler(union sigval sv)
// {
//     MessageTimerAttr* mess_attr = (MessageTimerAttr*)sv.sival_ptr;

//     auto iter = um_timers_.find(mess_attr->seq);
//     if(iter != um_timers_.end()) {
//         mess_attr->onResult(SubThingModelExecResult::SUB_MODEL_TIMEOUT, mess_attr->svcId, mess_attr->devId, nullptr, 0);
//         HILOGI("delete timer, seq: %{public}llu", mess_attr->seq);
//         timer_delete(iter->second->timerId);
//         delete iter->second->devId;
//         delete iter->second;
//     }
//     um_timers_.erase(iter);
// }

// void SubThingModel::SubThingModelExecResultRpyly(const SubThingModelExecResult res, const char *svcId, const char *devId, const char *data, const uint32_t len)
// {
//     IotcCharState reportInfo;
//     reportInfo.svcId = svcId;
//     memset(reportInfo.devId, 0, sizeof(reportInfo.devId));
//     memcpy(reportInfo.devId, devId, strlen(devId));
//     if(nullptr == data && res == SubThingModelExecResult::SUB_MODEL_TIMEOUT) {
//         cJSON *json = cJSON_CreateObject();
//         if (json == NULL) {
//             HILOGE("create obj error");
//             return;
//         }

//         if (cJSON_AddNumberToObject(json, "result", res) == NULL) {
//             cJSON_Delete(json);
//             HILOGE("add result error");
//             return;
//         }

//         reportInfo.data = cJSON_PrintUnformatted(json);
//         reportInfo.len = strlen(reportInfo.data);
//         int ret = IotcOhDevReportCharState(&reportInfo, 1);
//         if (ret != 0) {
//             cJSON_Delete(json);
//             HILOGE("IotcOhDevReportCharState error");
//             return;
//         }

//         cJSON_Delete(json);
//     } else {
//         cJSON *json = cJSON_ParseWithLength((char *)data, len);
//         if(nullptr == json) {
//             HILOGE("create json error");
//             return;
//         }

//         if (cJSON_AddNumberToObject(json, "result", res) == NULL) {
//             cJSON_Delete(json);
//             HILOGE("add result error");
//             return;
//         }
//         reportInfo.data = cJSON_PrintUnformatted(json);
//         reportInfo.len = strlen(reportInfo.data);

//         int ret = IotcOhDevReportCharState(&reportInfo, 1);
//         if (ret != 0) {
//             cJSON_Delete(json);
//             HILOGE("IotcOhDevReportCharState error");
//             return;
//         }

//         cJSON_Delete(json);
//     }
// }

// void SubThingModel::SubThingModelCustomSecData(const uint64_t seq, const uint8_t *data, uint32_t len)
// {
//     auto iter = um_timers_.find(seq);
//     if(iter != um_timers_.end()) {
//         iter->second->onResult(SubThingModelExecResult::SUB_MODEL_SUCC, iter->second->svcId, iter->second->devId, (char*)data, len);
//         timer_delete(iter->second->timerId);
//         delete iter->second->devId;
//         delete iter->second;
//         HILOGI("delete timer, seq: %{public}llu", seq);
//     }
//     HILOGE("not find seq");
// }

// }
// }
